Bagels or Pico, Fermi, Bagels is a number game. The computer thinks of a number and you try to guess what it is. Along the way you are given hints as to whether your guess contains any of the digits of the computer’s number and if they are in the proper place.
In the above screen image the player has guessed the digits that make up the computer’s number but the digits are in the wrong places.
If you click on the HOW TO button you are transported to a page that shows the rules of the game. The page is named how.to.
to instructions
how.to
end
Starting Up the Game
Clicking on the play button starts the game. Turtle t4 is a bee and is a decoration. Turtles d1, d2, and d3 are the digits you select. The t5 turtle remains hidden throughout the game and carries the background image. You will see later why this turtle is necessary.
to play
ask [t6] [setsh 92 wait 2 setsh 93]
ask [t4] [clickon]
ask [d1 d2 d3] [ht]
ask "t5 [ht setpos [0 0] setsh 70 stamp]
ask [n1 n2 n3 clue1 clue2 clue3][sety 135 ht seth 0]
make "num get.num
make "tries 0
make "guess "
make "click 0
end
Play sets up four variables.
:num is the computer’s three-digit number
:tries is a counter for the number of attempts you make
:guess is your number
:click is a counter to know when you have selected three digits.
The procedure, getnum, makes up the computer’s number. This procedure uses get.nozero, which uses random to generate a digit from 1 thru 9 and get.digit, which can generate a digit from 0 thru 9. Notice get.nozero is used to generate the first digit, which is not allowed to be 0. Thus 008 is not a number nor is 097.
If identical digits are generated, get.num makes up a new number.
to get.num
make "hundreds get.nozero
make "tens get.digit
make "units get.digit
ifelse (or :hundreds = :tens :hundreds = :units :tens = :units)
[op get.num]
[op (word :hundreds :tens :units)]
end
to get.nozero
op 1 + random 9
end
to get.digit
op random 10
end
Now the game is set and nothing visible happens, except the bee flies, until you click on three digits. Whenever you click on a digit turtle, the calc procedure is run.
The digit turtle blinks off and on to show you clicked on it. Then calc turns the job over to putnum.
to calc
blink putnum
end
to blink
repeat 1 [ht wait 1 st wait 1]
end
Here is putnum. It gets help from checknum and compare.guess. First putnum uses checknum to make sure 0 isn’t the first digit. Then putnum checks to see if you have clicked on three digits. If you have clicked on three digit turtles putnum assigns the digit shapes to three turtles and then displays the turtles in the box above the keyboard.
to putnum
make "click :click + 1
checknum last who
If 3 > count :guess [stop]
ask [n1][setsh word "reply first :guess]
ask [n2][setsh word "reply first bf :guess]
ask[n3] [setsh word "reply last :guess ]
ask [n1 n2 n3] [st]
make "click 0
compare.guess
end
The procedure, checknum, makes sure that the number you are constructing is legal. If the first digit of your number is zero it is rejected (by the if statement).
to checknum :digit
If and :click
1 :digit
0 [set.click stop]
make "guess word :guess :digit
ask (se word "d :click) [setsh word "n :digit st]
end
If the digit is okay it is attached to the other digits in your guess and displayed in the top left box.
Checking to see if your number matches the computer’s is handled by compare.guess. The number is a word and so it is taken apart using first, bf (butfirst) and last.
to compare.guess
let [fermi 0 pico 0 bagels "false]
make "tries :tries + 1
if equal? first :guess first :num [make "fermi :fermi + 1]
if member? first :guess bf :num [make "pico :pico + 1]
if (first bf :guess) = first bf :num [make "fermi :fermi + 1]
if member? first bf :guess word first :num last :num [make "pico :pico + 1]
if (last :guess) = last :num [make "fermi :fermi + 1]
if member? last :guess bl :num [make "pico :pico + 1]
ifelse 0 = (:pico + :fermi) [make "bagels "true][make "bagels "false]
print.clues
if :fermi = 3 [congrats stop]
if :tries = 20 [sorry stop]
make "guess " make "click 0
ask [d1 d2 d3][ht]
end
The Whole Thing
to play
ask [t4] [clickon]
ask [d1 d2 d3] [ht]
ask "t5 [ht setpos [0 0] setsh 70 stamp]
make "num get.num
make "tries 0
make "guess "
make "click 0
setup.start
end
to instructions
how.to
end
to get.num
make "hundreds get.nozero
make "tens get.digit
make "units get.digit
ifelse (or :hundreds = :tens :hundreds = :units :tens = :units)
[op get.num]
[op (word :hundreds :tens :units)]
end
to get.nozero
op 1 + random 9
end
to get.digit
op random 10
end
to set.click
make "click 0
make "guess "
end
to calc
blink putnum
end
to putnum
if not name? "click [stop]
make "click :click + 1
checknum last who
If 3 > count :guess [stop]
ask [n1][setsh word "reply first :guess]
ask [n2][setsh word "reply first bf :guess]
ask[n3] [setsh word "reply last :guess ]
ask [n1 n2 n3] [stamp]
make "click 0
make "cluenum 1
compare.guess
ask [n1 n2 n3 clue1 clue2 clue3] [bk 20]
end
to checknum :digit
If and :click
1 :digit
0 [set.click stop]
make "guess word :guess :digit
ask (se word "d :click) [setsh word "n :digit st]
end
to compare.guess
let [fermi 0 pico 0 bagels "false]
make "tries :tries + 1
if equal? first :guess first :num [make "fermi :fermi + 1]
if member? first :guess bf :num [make "pico :pico + 1]
if (first bf :guess) = first bf :num [make "fermi :fermi + 1]
if member? first bf :guess word first :num last :num [make "pico :pico + 1]
if (last :guess) = last :num [make "fermi :fermi + 1]
if member? last :guess bl :num [make "pico :pico + 1]
ifelse 0 = (:pico + :fermi) [make "bagels "true][make "bagels "false]
print.clues
if :fermi = 3 [congrats stop]
if :tries = 20 [sorry stop]
make "guess " make "click 0
ask [d1 d2 d3][ht]
end
to print.clues
if :bagels [ask [clue1] [setsh 72 stamp stop]]
repeat :fermi [ask word "clue :cluenum [setsh 73 stamp]make "cluenum :cluenum + 1]
repeat :pico [ask word "clue :cluenum [setsh 71 stamp] make "cluenum :cluenum + 1]
end
to blink
repeat 1 [ht wait 1 st wait 1]
end
to undo
carefully [ask word "d :click [ht]][]
carefully [make "guess bl :guess][stop]
make "click :click - 1
end
to congrats
wait 5
hooray
ask [try1 try2][ht]
ask [digit1] [ setsh word "n first :num]
ask [digit2] [setsh word "n first bf :num]
ask [digit3][setsh word "n last :num ]
ask [try1] [setsh word "n first :tries st]
if 1 = count :tries [stop]
ask [try2] [setsh word "n last :tries st]
end
to sorry
wait 5
toobad
ask [t1 t2 t3] [ht sety -60]
ask [t1] [ setsh word "n first :num]
ask [t2] [setsh word "n first bf :num]
ask [t3][setsh word "n last :num ]
ask [t1 t2 t3][st]
end
If the clue board gets messed up this procedure will help.
if you start from scratch these two procedures will help.
to make.numbers :number
if :number < 0 [stop]
newturtle word "c :number
set word "c :number "rule [launch [calc]]
setsh word "n :number
st
make.numbers :number - 1
end
Pico, Fermi, Bagels: A Guess My Number Game
Bagels or Pico, Fermi, Bagels is a number game. The computer thinks of a number and you try to guess what it is. Along the way you are given hints as to whether your guess contains any of the digits of the computer’s number and if they are in the proper place.
In the above screen image the player has guessed the digits that make up the computer’s number but the digits are in the wrong places.
If you click on the HOW TO button you are transported to a page that shows the rules of the game. The page is named how.to.
to instructions
how.to
end
Starting Up the Game
Clicking on the play button starts the game. Turtle t4 is a bee and is a decoration. Turtles d1, d2, and d3 are the digits you select. The t5 turtle remains hidden throughout the game and carries the background image. You will see later why this turtle is necessary.
to play
ask [t6] [setsh 92 wait 2 setsh 93]
ask [t4] [clickon]
ask [d1 d2 d3] [ht]
ask "t5 [ht setpos [0 0] setsh 70 stamp]
ask [n1 n2 n3 clue1 clue2 clue3][sety 135 ht seth 0]
make "num get.num
make "tries 0
make "guess "
make "click 0
end
Play sets up four variables.
:num is the computer’s three-digit number
:tries is a counter for the number of attempts you make
:guess is your number
:click is a counter to know when you have selected three digits.
The procedure, getnum, makes up the computer’s number. This procedure uses get.nozero, which uses random to generate a digit from 1 thru 9 and get.digit, which can generate a digit from 0 thru 9. Notice get.nozero is used to generate the first digit, which is not allowed to be 0. Thus 008 is not a number nor is 097.
If identical digits are generated, get.num makes up a new number.
to get.num
make "hundreds get.nozero
make "tens get.digit
make "units get.digit
ifelse (or :hundreds = :tens :hundreds = :units :tens = :units)
[op get.num]
[op (word :hundreds :tens :units)]
end
to get.nozero
op 1 + random 9
end
to get.digit
op random 10
end
Now the game is set and nothing visible happens, except the bee flies, until you click on three digits. Whenever you click on a digit turtle, the calc procedure is run.
The digit turtle blinks off and on to show you clicked on it. Then calc turns the job over to putnum.
to calc
blink putnum
end
to blink
repeat 1 [ht wait 1 st wait 1]
end
Here is putnum. It gets help from checknum and compare.guess. First putnum uses checknum to make sure 0 isn’t the first digit. Then putnum checks to see if you have clicked on three digits. If you have clicked on three digit turtles putnum assigns the digit shapes to three turtles and then displays the turtles in the box above the keyboard.
to putnum
make "click :click + 1
checknum last who
If 3 > count :guess [stop]
ask [n1][setsh word "reply first :guess]
ask [n2][setsh word "reply first bf :guess]
ask[n3] [setsh word "reply last :guess ]
ask [n1 n2 n3] [st]
make "click 0
compare.guess
end
The procedure, checknum, makes sure that the number you are constructing is legal. If the first digit of your number is zero it is rejected (by the if statement).
to checknum :digit
If and :click
1 :digit
0 [set.click stop]make "guess word :guess :digit
ask (se word "d :click) [setsh word "n :digit st]
end
If the digit is okay it is attached to the other digits in your guess and displayed in the top left box.
Checking to see if your number matches the computer’s is handled by compare.guess. The number is a word and so it is taken apart using first, bf (butfirst) and last.
to compare.guess
let [fermi 0 pico 0 bagels "false]
make "tries :tries + 1
if equal? first :guess first :num [make "fermi :fermi + 1]
if member? first :guess bf :num [make "pico :pico + 1]
if (first bf :guess) = first bf :num [make "fermi :fermi + 1]
if member? first bf :guess word first :num last :num [make "pico :pico + 1]
if (last :guess) = last :num [make "fermi :fermi + 1]
if member? last :guess bl :num [make "pico :pico + 1]
ifelse 0 = (:pico + :fermi) [make "bagels "true][make "bagels "false]
print.clues
if :fermi = 3 [congrats stop]
if :tries = 20 [sorry stop]
make "guess " make "click 0
ask [d1 d2 d3][ht]
end
The Whole Thing
to play
ask [t4] [clickon]
ask [d1 d2 d3] [ht]
ask "t5 [ht setpos [0 0] setsh 70 stamp]
make "num get.num
make "tries 0
make "guess "
make "click 0
setup.start
end
to instructions
how.to
end
to get.num
make "hundreds get.nozero
make "tens get.digit
make "units get.digit
ifelse (or :hundreds = :tens :hundreds = :units :tens = :units)
[op get.num]
[op (word :hundreds :tens :units)]
end
to get.nozero
op 1 + random 9
end
to get.digit
op random 10
end
to set.click
make "click 0
make "guess "
end
to calc
blink putnum
end
to putnum
if not name? "click [stop]
make "click :click + 1
checknum last who
If 3 > count :guess [stop]
ask [n1][setsh word "reply first :guess]
ask [n2][setsh word "reply first bf :guess]
ask[n3] [setsh word "reply last :guess ]
ask [n1 n2 n3] [stamp]
make "click 0
make "cluenum 1
compare.guess
ask [n1 n2 n3 clue1 clue2 clue3] [bk 20]
end
to checknum :digit
If and :click
1 :digit
0 [set.click stop]make "guess word :guess :digit
ask (se word "d :click) [setsh word "n :digit st]
end
to compare.guess
let [fermi 0 pico 0 bagels "false]
make "tries :tries + 1
if equal? first :guess first :num [make "fermi :fermi + 1]
if member? first :guess bf :num [make "pico :pico + 1]
if (first bf :guess) = first bf :num [make "fermi :fermi + 1]
if member? first bf :guess word first :num last :num [make "pico :pico + 1]
if (last :guess) = last :num [make "fermi :fermi + 1]
if member? last :guess bl :num [make "pico :pico + 1]
ifelse 0 = (:pico + :fermi) [make "bagels "true][make "bagels "false]
print.clues
if :fermi = 3 [congrats stop]
if :tries = 20 [sorry stop]
make "guess " make "click 0
ask [d1 d2 d3][ht]
end
to print.clues
if :bagels [ask [clue1] [setsh 72 stamp stop]]
repeat :fermi [ask word "clue :cluenum [setsh 73 stamp]make "cluenum :cluenum + 1]
repeat :pico [ask word "clue :cluenum [setsh 71 stamp] make "cluenum :cluenum + 1]
end
to blink
repeat 1 [ht wait 1 st wait 1]
end
to undo
carefully [ask word "d :click [ht]][]
carefully [make "guess bl :guess][stop]
make "click :click - 1
end
to congrats
wait 5
hooray
ask [try1 try2][ht]
ask [digit1] [ setsh word "n first :num]
ask [digit2] [setsh word "n first bf :num]
ask [digit3][setsh word "n last :num ]
ask [try1] [setsh word "n first :tries st]
if 1 = count :tries [stop]
ask [try2] [setsh word "n last :tries st]
end
to sorry
wait 5
toobad
ask [t1 t2 t3] [ht sety -60]
ask [t1] [ setsh word "n first :num]
ask [t2] [setsh word "n first bf :num]
ask [t3][setsh word "n last :num ]
ask [t1 t2 t3][st]
end
If the clue board gets messed up this procedure will help.
to setup.start
ask "t2 [ht setpos [195 135]]
ask [n1 n2 n3 clue1 clue2 clue3][sety 135 ht seth 0]
n1, setx 100 setsh 81
n2, setx 125 setsh 83
n3, setx 150 setsh 89
clue1, setx 195
clue2, setx 235
clue3, setx 270
end
if you start from scratch these two procedures will help.
to make.numbers :number
if :number < 0 [stop]
newturtle word "c :number
set word "c :number "rule [launch [calc]]
setsh word "n :number
st
make.numbers :number - 1
end
to setup.nums
c0, setpos [-168 40]
c1, setpos [-258 -20]
c2, setpos [-214 -20]
c3, setpos [-168 -20]
c4, setpos [-258 -80]
c5, setpos [-214 -80]
c6, setpos [-168 -80]
c7, setpos [-258 -140]
c8, setpos [-214 -140]
c9, setpos [-168 -140]
end